package ro.inf.bomberman;

import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import javax.imageio.ImageIO;

/**
 * Eine Singleton-Klasse zum speichern von Images in eimen AcceleratedImage zur
 * wiederholten Abfrage. Hiermit müssen alle Grafiken nur einmal geladen werden.
 *
 * @author Michi
 */
public class DrawCache {

    // Instanzierung des einen Objekts
    private static DrawCache single = new DrawCache();
    // Hashmap zum Speichern der Grafiken
    private HashMap<String, Sprite> sprites = new HashMap<String, Sprite>();

    /**
     * Gibt das einzige Objekt der Klasse zurück.
     *
     * @return DrawCache Das Single-Objekt der Klasse DrawChache.
     * @author Michi
     */
    public static DrawCache get() {
        return single;
    }

    /**
     * Hält Grafiken vor die bereits einmal angefragt wurden. Falls die Grafik
     * noch nicht angefordert wurde wird sie in den Cache geladen.
     *
     * @param ref String mit dem Pfad relativ zum Projekt zur Grafik die geladen
     * werden soll.
     * @return Sprite die angeforderte Grafik.
     * @author Michi
     */
    public Sprite getSprite(String ref) {
        if (sprites.get(ref) != null) {
            return (Sprite) sprites.get(ref);
        }
        BufferedImage sourceImage = null;

        try {
            URL url = this.getClass().getClassLoader().getResource(ref);

            if (url == null) {
                //System.out.println("Nicht gefunden.");
            }
            sourceImage = ImageIO.read(url);
        } catch (IOException e) {
            //System.out.println("Nicht gefunden.");
        }

        GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
        Image image = gc.createCompatibleImage(sourceImage.getWidth(),
                sourceImage.getHeight(), Transparency.BITMASK);

        image.getGraphics().drawImage(sourceImage, 0, 0, null);

        Sprite sprite = new Sprite(image);
        sprites.put(ref, sprite);

        return sprite;
    }
}
